import router from './router'
import store from './store'
import storage from 'store'
import NProgress from 'nprogress' // progress bar
import '@/components/NProgress/nprogress.less' // progress bar custom style
import notification from 'ant-design-vue/es/notification'
import { setDocumentTitle, domTitle } from '@/utils/domUtil'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const loginRoutePath = '/user/login'

const allowList = ['login', 'register', 'registerResult'] // no redirect allowList

const defaultRoutePath = '/dashboard/workplace'

router.beforeEach(async(to, from, next) => {
  NProgress.start() // start progress bar
  document.title = getPageTitle(to.meta.title)
  /* has token */
  if (storage.get('token')) {
    if (to.path === loginRoutePath) {
      next({ path: defaultRoutePath })
      NProgress.done()
    } else {
      // check login user.roles is null
      const menuIsReq = store.state.permission.isReq
      if (menuIsReq) {
        next()
      } else {
        try {
          // generate accessible routes map based on roles
          const accessRoutes = await store.dispatch('generateRoutes')

          router.addRoutes(accessRoutes)

          // hack method to ensure that addRoutes is complete
          // set the replace: true, so the navigation will not leave a history record
          next({ ...to, replace: true })
        } catch (error) {
          notification.error({
            message: '错误',
            description: '请求用户信息失败，请重试'
          })

          // remove token and go to login page to re-login
          await store.dispatch('Logout')

          next({ path: loginRoutePath, query: { redirect: to.fullPath }})
          NProgress.done()
        }
      }
    }
  } else {
    if (allowList.includes(to.name)) {
      // 在免登录名单，直接进入
      next()
    } else {
      next({ path: loginRoutePath, query: { redirect: to.fullPath }})
      NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
    }
  }
})

router.afterEach(() => {
  NProgress.done() // finish progress bar
})
